﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Region.Utils;

namespace Region.Forms
{

    public partial class RasporForm : Form, IDBForm
    {
        private Engine m_engine;
        private Raspor m_raspor;
        ObjectFormUtil m_reader;
        //IDBForm интерфейс
        public ObjectFormUtil i_reader{get{return m_reader;}}
        public DBObject i_object{get{return m_raspor;}}
        
        private Kont m_kont;
        List<Editors.EditorInfo> ResultInfo;
        Dictionary<String, Int32> ResultPosition;
        Dictionary<String, Int32> ResultInfo_RasporUsers;
        public void readRaspor()
        {
            this.Text = "Редактирование распоряжения №" + m_raspor.RasporNum.ToString() + " от " + m_raspor.Date.ToShortDateString();
            m_reader.get();            
            RasporUsers.Items.Clear();
            foreach (KeyValuePair<Int32, Raspor.RasporUser> RU in m_raspor.RasporUsers)
            {
                User U = m_engine.getUser(RU.Value.UserID);
                RasporUsers.Items.Add(new Utils.ListItemValue(U.FIO, U.UserID));
            }
            AddRasporUsersList.Items.Clear();
            foreach (KeyValuePair<Int32, String> RU in m_engine.UserFIO)
                if (RU.Value != "")
                {
                    AddRasporUsersList.Items.Add(new Utils.ListItemValue(RU.Value, RU.Key));
                }            
            RasporUsers.Enabled = AddRasporUsersList.Enabled = AddRasporUsers.Enabled = DelRasporUser.Enabled = m_raspor.poleAccess("IspInfo");
            switch (m_raspor.Pred)
            {
                case 1: Pred1.Checked = true; break;
                case 2: Pred2.Checked = true; break;
                case 3: Pred3.Checked = true; break;
                case 41: Pred41.Checked = true; break;
                case 42: Pred42.Checked = true; break;
                case 43: Pred43.Checked = true; break;
                case 44: Pred44.Checked = true; break;
            }
            Pred1.Enabled = Pred2.Enabled = Pred3.Enabled = Pred41.Enabled = Pred42.Enabled = Pred43.Enabled = Pred44.Enabled = m_raspor.poleAccess("Pred");
            
            //Подписи


            if (m_raspor.RucPodpis == 0)
            {
                RucPodpisLabel.Text = "Не подписано";
                AddRucPodpis.Enabled = m_raspor.poleAccess("Action_RucPodpis");
                AddRucPodpis.Text = "Подписать";
            }
            else
            {
                RucPodpisLabel.Text = m_engine.getUser(m_raspor.RucPodpis).FIO;
                AddRucPodpis.Enabled = m_raspor.poleAccess("Action_RucPodpis");
                AddRucPodpis.Text = "Снять подпись";
            }
            if (m_raspor.NachPodpis == 0)
            {
                NachPodpisLabel.Text = "Не подписано";
                AddNachPodpis.Enabled = m_raspor.poleAccess("Action_NachPodpis");
                AddNachPodpis.Text = "Подписать";
            }
            else
            {
                NachPodpisLabel.Text = m_engine.getUser(m_raspor.NachPodpis).FIO;
                AddNachPodpis.Enabled = m_raspor.poleAccess("Action_NachPodpis");
                AddNachPodpis.Text = "Снять подпись";
            }
            //RucComment.Text = m_raspor.RucComment;
            //RucComment.ReadOnly = !m_raspor.poleAccess("RucComment");
            //NachComment.Text = m_raspor.NachComment;
            //NachComment.ReadOnly = !m_raspor.poleAccess("NachComment");
            CheckRaspor.Enabled = m_raspor.poleAccess("Action_StatusVip");
            StatusVipLabel.Text = m_raspor.StatusVip ? "Выполнено" : "Черновик";
            CheckRaspor.Text = m_raspor.StatusVip ? "Черновик" : "Проверить распоряжение";
            StatusVipLabel.ForeColor = m_raspor.StatusVip ? Color.Green : Color.Red;
            //Вывод информации о контрагенте
            EditKont.Enabled = KontObjectList.Enabled = m_raspor.poleAccess("KontID");
            m_kont = null;
            KontName.Text = "[Не указан контрагент]";
            INN.Text = "";
            OGRN.Text = "";
            KontGosReg.Text = "";
            KontForm.Text = "";
            KontType.Text = "";
            ULAddress.Text = "";
            FKAddress.Text = "";
            AddKontObject.Enabled = false;
            KontObjectList.Items.Clear();
            if (m_raspor.KontID != 0)
            {
                m_kont = m_raspor.Kont;
                KontName.Text = m_kont.KontName;
                INN.Text = m_kont.INN;
                OGRN.Text = m_kont.OGRN;
                KontGosReg.Text = m_kont.KontGosReg.ToShortDateString();
                KontForm.Text = m_engine.KontForm[m_kont.KontForm];
                KontType.Text = m_engine.KontType[m_kont.KontTypeID];
                ULAddress.Text = m_kont.KontULAddress;
                FKAddress.Text = m_kont.KontFKAddress;
                AddKontObject.Enabled = m_raspor.poleAccess("KontID");
                KontObjectList.Items.Clear();
                Dictionary<Int32, String> Raions = m_engine.Raions;
                Dictionary<Int32, Raspor.RasporObject> RO = m_raspor.RasporObjects;
                foreach (KeyValuePair<Int32, Kont.KontObject> K in m_kont.KontObjects)
                {
                    //User U = m_engine.getUser();
                    Int32 KontObjectID = K.Key;
                    String S = K.Value.KontObjectName + ": " + Engine.getAddressString(K.Value.KontObjectPostIndex, K.Value.KontObjectRegion, Raions[K.Value.KontObjectRaionID], K.Value.KontObjectGorod, K.Value.KontObjectNaspunkt, K.Value.KontObjectStreet, K.Value.KontObjectDom, K.Value.KontObjectKorpus, K.Value.KontObjectKvart);
                    KontObjectList.Items.Add(new Utils.ListItemValue(S, KontObjectID), RO.ContainsKey(KontObjectID));
                }
            }
            // Создание закладки основные результаты
            readWorkTime();
            Dictionary<Int32, Raspor.RasporUser> l_RasporUsers = m_raspor.RasporUsers;
            
            /*if (ResultInfo==null) 
            {
                Dictionary<Int32, String> NNarList = new Dictionary<Int32, String> { { -1, "Не указано" }, { 0, "Выявлены" }, { 1, "Не выявлены" } };
                Dictionary<Int32, String> YNN = new Dictionary<Int32, String> { { -1, "Не указано" }, { 0, "Нет" }, { 1, "Да" } };
                Dictionary<Int32, Engine.TOkvedInfo> Okved = m_engine.Okved;
                Editors.TreeItem[] Okveds = new Editors.TreeItem[Okved.Count];
                Int32 N=0;
                foreach (KeyValuePair<Int32, Engine.TOkvedInfo> O in Okved)
                {
                    Editors.TreeItem TI = new Editors.TreeItem();
                    TI.ID = O.Value.OkvedID;
                    TI.ParentID = O.Value.ParentOkvedID;
                    TI.Caption = O.Value.OkvedName+" "+O.Value.OkvedTitle;
                    Okveds[N++] = TI;
                }
                Int32 e = 0;
                ResultInfo = new List< Editors.EditorInfo> { 
                    //Основные результаты
                //new Editors.EditorInfo("AktDate","DateTime",Result1,"Дата акта",100,null,null,0,null),
                new Editors.EditorInfo("OkvedID","Tree",Result1,"Основное направление деятельности",100,null,Okveds,0,null),
                //new Editors.EditorInfo("","Label",Result1,"Фактическая дата",100,null,null,-1,null),
                //new Editors.EditorInfo("FStart","DateTime",Result1,"Начала проверки",100,null,null,0,null),
                //new Editors.EditorInfo("FEnd","DateTime",Result1,"Окончания проверки",100,null,null,0,null),
                //new Editors.EditorInfo("","Label",Result1,"Предписание",200,null,null,Result1.Width-20,null),
                new Editors.EditorInfo("PredpisDate","DateTime",Result1,"Выдано",100,null,null,0,null),
                new Editors.EditorInfo("ControlDate","DateTime",Result1,"Дата контроля предписания",100,null,null,0,null),
                new Editors.EditorInfo("","Label",Result1,"Выявленые нарушения и наказания",200,null,null,Result1.Width-20,null),
                new Editors.EditorInfo("NumNar","Int",Result1,"Количество выявленных нарушений обязательных требований",300,null,null,350,null),
                new Editors.EditorInfo("NNar","List",Result1,"Нарушения",150,null,NNarList,e,null),
                new Editors.EditorInfo("Predstav","List",Result1,"Выдано представление",150,null,YNN,e,null),
                new Editors.EditorInfo("NStop","List",Result1,"Временный запрет деятельности",150,null,YNN,e,null),
                new Editors.EditorInfo("SLic","List",Result1,"Приостановлено действие лицензии",150,null,YNN,e,null),
                new Editors.EditorInfo("NLic","List",Result1,"Аннулирована лицензия",150,null,YNN,e,null),                
                new Editors.EditorInfo("SudZ1","Int",Result1,"Кол-во обращений в суд \nс заялением защиту потребителя",300,null,null,e,null),
                new Editors.EditorInfo("SudZ2","Int",Result1,"Кол-во обращений в суд с заялением защиту неопредлённого круга потребителей",300,null,null,e,null),
                new Editors.EditorInfo("Nar1","List",Result1,"Выявлены нарушения обязательных требований представляющие непосредственную угрозу причинения вреда жизни и здоровью",300,null,YNN,e,null),
                new Editors.EditorInfo("Nar2","List",Result1,"Выявлены нарушения обязательных требований, явившиеся причинойпричинения вреда жизни и здоровью ",300,null,YNN,e,null),
                new Editors.EditorInfo("","Label",Result1,"Всё время затраченное на проверку(в часах)(по ВЦП)",200,null,null,Result1.Width-20,null),
                };*
                if (ResultInfo_RasporUsers==null) ResultInfo_RasporUsers = new Dictionary<string, int>(); 	                                
                foreach (KeyValuePair<Int32, Raspor.RasporUser> RU in l_RasporUsers)
                {
                    User User = m_engine.getUser(RU.Value.UserID);                                        
                    String name = "UserWorkTime_"+RU.Key;
                    Editors.EditorInfo EI = new Editors.EditorInfo(name, "Mask", Result1, User.FullFIO, 300, null, "9999:00", e, SetValue);
                    ResultInfo.Add(EI);
                    ResultInfo_RasporUsers[name] = RU.Key;
                }
                var pl = new ProtokolList(m_engine);
                pl.setWhere("RasporID",m_raspor.RasporID);
                pl.Filter();
                protokolList.Items.Clear();
                for(Int32 i=0;i<pl.NumLines;i++)
                {
                  var line  = pl.getLine(i);
                  protokolList.Items.Add(new ListItemValue(line.ProtokolNum+" от "+line.ProtokolReg.ToShortDateString(),line.ProtokolID));
                }
            }
            if (ResultPosition == null)
            {
                ResultPosition = new Dictionary<String,Int32>();
                for (Int32 i = 0; i < ResultInfo.Count; i++) ResultPosition[ResultInfo[i].Name] = i;
            }
            // Присвоить значения
            for(Int32 i=0;i<ResultInfo.Count;i++) 
            {
                Editors.EditorInfo Info = ResultInfo[i];
                if (ResultInfo_RasporUsers.ContainsKey(Info.Name))
                {
                    Int32 Minute = l_RasporUsers[ResultInfo_RasporUsers[Info.Name]].WorkTime;                    
                    Info.Value = (Minute / 60).ToString("0000") + ":" + (Minute % 60).ToString("00");
                    Editors.setEditor(ref Info);
                }
                else if (Info.Name != "")
                {
                    Info.Value = m_raspor.getPole(Info.Name);/**
                    Editors.setEditor(ref Info,m_reader);
                }
                else                
                    Editors.setEditor(ref Info);
            }                        */
        }
        /*void SetValue(String Name, Object Value)
        {
            if (ResultInfo_RasporUsers.ContainsKey(Name))
            {                
                String[] S = ((String)Value).Split(':');                
                m_raspor.setUserWorkTime(ResultInfo_RasporUsers[Name], Int32.Parse(S[0]) * 60 + Int32.Parse(S[0]));
            }
            else m_raspor.setPole(Name, Value);
        }*/
        private void EditWorTime_Validating(object sender, DataGridViewCellValidatingEventArgs e)
        {
          DataTable dt = (DataTable)WorkTimeTable.DataSource;
          if (e.ColumnIndex==2)
          {
            Int32 Time=0;
            if (Utils.Convert.readTime((String)e.FormattedValue,out Time))
            {
              m_raspor.setUserWorkTime((Int32)dt.Rows[e.RowIndex]["UserID"], Time);
              dt.Rows[e.RowIndex]["Time"] = (Time / 60) + "ч. " + (Time % 60).ToString("00")+"мин.";
            }
            else e.Cancel = true;
            //dt.Rows[e.RowIndex]["Time"] = "####";  
          }
        }
        void readWorkTime()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("UserID",typeof(Int32));
            var FIO  = dt.Columns.Add("FIO");
            FIO.ReadOnly = true;
            dt.Columns.Add("TIME");
            
            foreach(var RU in m_raspor.RasporUsers)
            {
              User User = m_engine.getUser(RU.Value.UserID);   
              DataRow r = dt.NewRow();
              r["FIO"] = User.FIO;
              r["UserID"] = RU.Value.UserID;
              Int32 Minute = RU.Value.WorkTime;                    
              r["TIME"] = (Minute / 60) + "ч. " + (Minute % 60).ToString("00")+"мин.";
              dt.Rows.Add(r);
            }
            WorkTimeTable.DataSource = dt;
            WorkTimeTable.Columns[0].Visible = false;
            WorkTimeTable.Columns[1].HeaderCell.Value = "Специалист";
            WorkTimeTable.Columns[2].HeaderCell.Value = "Время";
            WorkTimeTable.CellValidating += EditWorTime_Validating;
        }
        public RasporForm(Engine engine, Int32 RasporID)
        {
            m_engine = engine;
            m_raspor = m_engine.getRaspor(RasporID);
            m_reader = new ObjectFormUtil(m_engine, m_raspor);
            //m_raspor.RasporNum = 10;
            InitializeComponent();
            Properties.Settings ps = Properties.Settings.Default;
            // Дополнительные параметры для редакторов
            var YNN = new Dictionary<Int32, String>() { { 0, "Нет" }, { 1, "Да" }, { -1, "Неуказан" }};
            var NNarList = new Dictionary<Int32, String>() { { 0, "Выявлены" }, { 1, "Не выявлены" }, { -1, "Неуказан" }};
            Dictionary<String,Object> ListExProcessor = new Dictionary<String,Object>()
            {
              {"CheckPlan", new Dictionary<Boolean, String>() { { false, "Внеплановая" }, { true, "Плановая" }}},
              {"TP",new Dictionary<Int32, String>() { { 0, "Не более 20 рабочих дней" }, { 1, "50 часов(Малый бизнес)" }, { 2, "15 часов(Микробизнес)" }}},
              {"OsnovID", engine.Osnov},
              {"PredpisFull",YNN},
              {"PredpisTime",YNN},
              {"NNar",NNarList},
              {"Nar1",YNN},
              {"Nar2",YNN},
              {"Nar3",YNN},
            };
            
            DBForm.addEditors(this,this,ListExProcessor);
            
           
            
            /*m_reader.AddEditor(RasporNum, "RasporNum");
            m_reader.AddEditor(Date, "Date");
            m_reader.AddEditor(CheckDoc, "CheckDoc");
            m_reader.AddEditor(CheckGo, "CheckGo");
            m_reader.AddEditor(CheckPlan, "CheckPlan", new Dictionary<Boolean, String>() { { false, "Внеплановая" }, { true, "Плановая" }});
            m_reader.AddEditor(CheckLicen, "CheckLicen");
            m_reader.AddEditor(Date, "Date");
            m_reader.AddEditor(IspInfo, "IspInfo");
            m_reader.AddEditor(ExpertsInfo, "ExpertsInfo");
            m_reader.AddEditor(TargetInfo, "TargetInfo");
            m_reader.AddEditor(TaskInfo, "TaskInfo");
            m_reader.AddEditor(TP, "TP",new Dictionary<Int32, String>() { { 0, "Не более 20 рабочих дней" }, { 1, "50 часов(Малый бизнес)" }, { 2, "15 часов(Микробизнес)" }});
            m_reader.AddEditor(Start, "Start");
            m_reader.AddEditor(End, "End");
            m_reader.AddEditor(OsnovID, "OsnovID",engine.Osnov); 
            m_reader.AddEditor(OsnovInfo, "OsnovInfo"); 
            m_reader.AddEditor(MKontrInfo, "MKontrInfo"); 
            m_reader.AddEditor(AReglamInfo, "AReglamInfo"); 
            m_reader.AddEditor(PDocInfo, "PDocInfo"); 
            m_reader.AddEditor(RucComment, "RucComment"); 
            m_reader.AddEditor(NachComment, "NachComment");
            // Результаты
            m_reader.AddEditor(AktDate, "AktDate");
            m_reader.AddEditor(FStart, "FStart"); 
            m_reader.AddEditor(FEnd, "FEnd");
            m_reader.AddEditor(PredpisFull, "PredpisFull",YNN);
            m_reader.AddEditor(PredpisTime, "PredpisTime",YNN);*/
            
            
            //Font = new Font(Font.FontFamily, (float)ps.RasporForm_Size);
            readRaspor();
        }
        private void AddExpertInfo_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            ExpertsInfo.Text += "Свидетельство об аккредитации от 26.02.2010 №41-АК (обеспечение санитарно-эпидемиологического благополучия населения; обеспечение защиты прав потребителей и потребительского рынка), выданное Федеральной службой по надзору в сфере защиты прав потребителей и благополучия человека.";
        }
        private void ZoomPlus_Click(object sender, EventArgs e)
        {
            Font = new Font(Font.FontFamily, (float)Math.Min(Font.Size*1.2,17.1));
            Properties.Settings ps = Properties.Settings.Default;
            ps.RasporForm_Size = Font.Size;
            ps.Save();
        }
        private void ZoomMinus_Click(object sender, EventArgs e)
        {
            Font = new Font(Font.FontFamily, (float)Math.Max(Font.Size / 1.2, 6.875));
            Properties.Settings ps = Properties.Settings.Default;
            ps.RasporForm_Size = Font.Size;
            ps.Save();
        }
        private void Page1Next_Click(object sender, EventArgs e){tabControl1.SelectedTab = Page2;}
        private void Page2Next_Click(object sender, EventArgs e){tabControl1.SelectedTab = Page3;}
        private void Page3Next_Click(object sender, EventArgs e){tabControl1.SelectedTab = Page4;}
        private void RefrashButton_Click(object sender, EventArgs e)
        {
            m_raspor.Refresh();
            readRaspor();
        }
        private void CheckRaspor_Click(object sender, EventArgs e)
        {            
            List<String> cl = new List<String>();
            if (m_raspor.StatusVip==false)
                m_raspor.AddUserPodpis(out cl);
            else
                m_raspor.DelUserPodpis();
            CheckRasporList.Items.Clear();
            foreach (String S in cl) CheckRasporList.Items.Add(S);
            readRaspor();
        }
        private void saveRaspor()
        {
            Int32 Pred;
            m_reader.set();
            //Основные поля
            Dictionary<Int32, Raspor.RasporUser> RU1 = m_raspor.RasporUsers;
            Dictionary<Int32, bool> RU2 = new Dictionary<Int32, bool>();
            foreach (KeyValuePair<Int32, Raspor.RasporUser> I in m_raspor.RasporUsers) RU2[(Int32)I.Key] = false;//Пометить всех исполнителей на удаление
            foreach (Utils.ListItemValue LIV in RasporUsers.Items) RU2[(Int32)LIV.Value] = true;//Пометить специалистов на добавление
            foreach (KeyValuePair<Int32, bool> I in RU2) if (I.Value) m_raspor.AddRasporUser(I.Key); else m_raspor.DelRasporUser(I.Key);
            Dictionary<Int32, Raspor.RasporObject> RO1 = m_raspor.RasporObjects;
            Dictionary<Int32, bool> RO2 = new Dictionary<Int32, bool>();
            foreach (KeyValuePair<Int32, Raspor.RasporObject> I in m_raspor.RasporObjects) RO2[(Int32)I.Key] = false;//Пометить всех исполнителей на удаление
            foreach (Utils.ListItemValue LIV in KontObjectList.CheckedItems) RO2[(Int32)LIV.Value] = true;//Пометить специалистов на добавление
            foreach (KeyValuePair<Int32, bool> I in RO2) if (I.Value) m_raspor.AddRasporObject(I.Key); else m_raspor.DelRasporObject(I.Key);
            Pred = Pred1.Checked ? 1 : Pred2.Checked ? 2 : Pred3.Checked ? 3 : Pred41.Checked ? 41 : Pred42.Checked ? 42 : Pred43.Checked ? 43 : Pred44.Checked ? 44 : 0;
            if (m_raspor.poleAccess("Pred") && Pred != m_raspor.Pred) m_raspor.Pred = Pred;
            m_raspor.save();
        }
        private void Save(object sender, EventArgs e)
        {
            saveRaspor();
        }
        private void EditKont_Click(object sender, EventArgs e)
        {
            if (m_raspor.poleAccess("KontID"))
            {
                var KL = new Forms.RegionKontList(m_engine);
                if (KL.ShowDialog() == DialogResult.OK)
                {
                    m_raspor.KontID = KL.SelectKontID;
                    saveRaspor();
                    readRaspor();
                }
            }   
        }
        private void печатьToolStripButton_Click(object sender, EventArgs e)
        {

        }
        private void AddRasporUsers_Click(object sender, EventArgs e)
        {
            if (!RasporUsers.Items.Contains(AddRasporUsersList.SelectedItem))
                RasporUsers.Items.Add(AddRasporUsersList.SelectedItem);
        }
        private void DelRasporUser_Click(object sender, EventArgs e)
        {
            if (RasporUsers.SelectedItem != null)
                RasporUsers.Items.Remove(RasporUsers.SelectedItem);
        }
        private void AddRucPodpis_Click(object sender, EventArgs e)
        {
            if (m_raspor.RucPodpis > 0) m_raspor.DelRucPodpis(); else m_raspor.AddRucPodpis();
            readRaspor();
        }
        private void AddNachPodpis_Click(object sender, EventArgs e)
        {
            if (m_raspor.NachPodpis > 0) m_raspor.DelNachPodpis(); else m_raspor.AddNachPodpis();
            readRaspor();
        }
        private void RasporForm_FormClosing(object sender, FormClosingEventArgs e)
        {
          //if (m_raspor.isEdit())
            switch (MessageBox.Show("Перед закрытием сохранить распоряжение?", "Зарыть", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1))
            {
            case DialogResult.Yes: saveRaspor(); break;
            case DialogResult.No: break;
            case DialogResult.Cancel: e.Cancel = true; break;
            }
        }
        private void AddKontObject_Click(object sender, EventArgs e)
        {
            var F = new Forms.KontObjectEditForm(m_engine,m_kont, 0);
            F.ShowDialog();
        }
        private void KontEdit_Click(object sender, EventArgs e)
        {
          if (m_raspor.KontID==0) return;//Если не выбран контрагент то и редактировать его нельзя
          KontForm F = new KontForm(m_engine, m_raspor.KontID);
          F.ShowDialog();
        } 
        void PrintButtonClick(object sender, EventArgs e)
        {
            string md = Environment.GetFolderPath(Environment.SpecialFolder.Personal);//путь к Документам
            if (System.IO.Directory.Exists(md + @"\Распоряжения") == false)
            {
                System.IO.Directory.CreateDirectory(md + @"\Распоряжения");
            }
            String FileName = md + @"\Распоряжения\" + m_raspor.RasporNum + ".rtf";
            if (m_raspor.exportRTF(FileName))
            {
              // Открыть файл во внешней программе
              var pr = new System.Diagnostics.Process();
              pr.StartInfo.FileName = FileName;
              pr.Start();
            }                    
        }
        void SaveButtonClick(object sender, System.EventArgs e)
        {
        	saveRaspor();
        }        

    }
}
